From 5ca91af2f8fbcac9dfa1ed61c7045dac9b6cd722 Mon Sep 17 00:00:00 2001 From: "emellor@ewan" Date: Wed, 12 Oct 2005 13:00:55 +0100 Subject: [PATCH] Ignore any watches that fire for which we do not have a registration. This can happen if there are watches in flight at the same time as a deregistration, and also seems to happen spuriously on xend restart. This fixes the Invalid token error that has been seen on xend restart. Signed-off-by: Ewan Mellor --- tools/python/xen/lowlevel/xs/xs.c | 10 ++++++++-- tools/python/xen/xend/xenstore/xswatch.py | 16 +++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/tools/python/xen/lowlevel/xs/xs.c b/tools/python/xen/lowlevel/xs/xs.c index 48a317dd88..b676419227 100644 --- a/tools/python/xen/lowlevel/xs/xs.c +++ b/tools/python/xen/lowlevel/xs/xs.c @@ -513,6 +513,7 @@ static PyObject *xspy_read_watch(PyObject *self, PyObject *args, goto exit; if (!PyArg_ParseTupleAndKeywords(args, kwds, arg_spec, kwd_spec)) goto exit; +again: Py_BEGIN_ALLOW_THREADS xsval = xs_read_watch(xh, &num); Py_END_ALLOW_THREADS @@ -529,8 +530,13 @@ static PyObject *xspy_read_watch(PyObject *self, PyObject *args, break; } if (i == PyList_Size(xsh->watches)) { - PyErr_SetString(PyExc_RuntimeError, "invalid token"); - goto exit; + /* We do not have a registered watch for the one that has just fired. + Ignore this -- a watch that has been recently deregistered can still + have watches in transit. This is a blocking method, so go back to + read again. + */ + free(xsval); + goto again; } /* Create tuple (path, token). */ val = Py_BuildValue("(sO)", xsval[XS_WATCH_PATH], token); diff --git a/tools/python/xen/xend/xenstore/xswatch.py b/tools/python/xen/xend/xenstore/xswatch.py index 8a2da8d12c..3fc0f75645 100644 --- a/tools/python/xen/xend/xenstore/xswatch.py +++ b/tools/python/xen/xend/xenstore/xswatch.py @@ -10,6 +10,9 @@ import threading from xen.lowlevel import xs from xen.xend.xenstore.xsutil import xshandle +from xen.xend.XendLogging import log + + class xswatch: watchThread = None @@ -41,10 +44,13 @@ class xswatch: while True: try: we = cls.xs.read_watch() - except RuntimeError, ex: - print ex - raise - watch = we[1] - watch.fn(*watch.args, **watch.kwargs) + watch = we[1] + watch.fn(*watch.args, **watch.kwargs) + except: + log.exception("read_watch failed") + # Ignore this exception -- there's no point throwing it + # further on because that will just kill the watcher thread, + # which achieves nothing. + watchMain = classmethod(watchMain) -- 2.30.2